package cn.springcloud.alibaba.ums.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

@Slf4j
@Component
@ServerEndpoint("/websocket/{sid}")
public class WebSocketServer {

	//静态变量，用来记录当前在线连接数。应该把它设计成线程安全的。
	private static volatile int onlineCount = 0;

	//concurrent包的线程安全Set，用来存放每个客户端对应的MyWebSocket对象。
	private static final CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();

	//与某个客户端的连接会话，需要通过它来给客户端发送数据
	// private Session session;

	//接收sid
	private String sid = "";

	// @OnOpen
	// public void onOpen(Session session, @PathParam("sid") String sid) {
	// 	this.session = session;
	// 	webSocketSet.add(this);     //加入set中
	// 	addOnlineCount();           //在线数加1
	// 	log.info("有新窗口开始监听:" + sid + ",当前在线人数为" + getOnlineCount());
	// 	this.sid = sid;
	// }

	@OnClose
	public void onClose() {
		webSocketSet.remove(this);  //从set中删除
		subOnlineCount();           //在线数减1
		log.info("有一连接关闭！当前在线人数为" + getOnlineCount());
	}

	/**
	 * 收到客户端消息后调用的方法
	 */
	// @OnMessage
	// public void onMessage(String message, Session session) {
	// 	log.info("收到来自窗口" + sid + "的信息:" + message);
	// 	//群发消息
	// 	for (WebSocketServer item : webSocketSet) {
	// 		try {
	// 			item.sendMessage(message);
	// 		} catch (IOException e) {
	// 			e.printStackTrace();
	// 		}
	// 	}
	// }

	// @OnError
	// public void onError(Session session, Throwable error) {
	// 	log.error("发生错误");
	// 	error.printStackTrace();
	// }

	/**
	 * 实现服务器主动推送
	 */
	// public void sendMessage(String message) throws IOException {
	// 	this.session.getBasicRemote().sendText(message);
	// }

	/**
	 * 群发自定义消息
	 */
	// public static void sendInfo(String message, @PathParam("sid") String sid) throws IOException {
	// 	log.info("推送消息到窗口" + sid + "，推送内容:" + message);
	// 	for (WebSocketServer item : webSocketSet) {
	// 		try {
	// 			if (sid == null) {
	// 				item.sendMessage(message);
	// 			} else if (item.sid.equals(sid)) {
	// 				item.sendMessage(message);
	// 			}
	// 		} catch (IOException e) {
	//
	// 		}
	// 	}
	// }

	public static synchronized int getOnlineCount() {
		return onlineCount;
	}

	public static synchronized void addOnlineCount() {
		WebSocketServer.onlineCount++;
	}

	public static synchronized void subOnlineCount() {
		WebSocketServer.onlineCount--;
	}
}
